/*
 * @Author: LVGRAPE
 * @LastEditors: LVGRAPE
 */
#ifndef FC_STATE_H
#define FC_STATE_H
#include <stdint.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define FC_STATE_SET(state) (fc_states |= (1 << state))
#define FC_STATE_CLEAR(state) (fc_states &= ~(1 << state))
#define FC_STATE_CHECK(state) (fc_states & (1 << state))
#define FC_ERROR_CHECK(state) (fc_states & (1 << state))
#define FC_ERROR_SET(state) (fc_states |= (1 << state))
#define FC_ERROR_RESET(state) (fc_states &= ~(1 << state))

    typedef enum
    {
        FC_ACC_GYRO_HARDFAULT = 0, // 陀螺仪与加速度计错误
        FC_BARO_HARDFAULT,         // 气压计错误
        FC_RC_HARDFAULT,           // 无线模块错误
        FC_OPTICALFLOW_HARDFAULT,  // 光流模块错误
        FC_COMPASS_HARDFAULT,      // 罗盘模块错误
        FC_IMU_CALIBRATING,        // 水平校准带中
        FC_RC_PAIRING,             // 无线对频中
        FC_RC_LOST,                // 无线无信号
        FC_COMPASS_CALIBRATING,    // 罗盘校准中
        FC_OK_TO_ARM,              // 解锁中
        FC_EMERGENCY_STOP,         // 急停
        FC_ARMED,                  // 解锁了
        FC_ARMING_ALERK,           // 解锁警报
        FC_MODE_STANDARD_INDOOR,   // 标准室内
        FC_MODE_STANDARD_OUTDOOR,  // 标准室外
        FC_LOW_POWER,              // 低电量
        FC_LASER_HARDFAULT,
        FC_FACTORY_TEST, // 出厂测试
        FC_MANUAL_MODE,  // 手动模式
        FC_FLIPING_MODE, // 手动模式
        FC_LANDING,
        FC_LANDED,
        FC_HEADLESS_MODE,
        FC_PROGRAM_MODE,
        FC_TAKINGOFF,
        FC_AUTO_TAKINGOFF,
        FC_AIRBORN,
        FC_PRORAM_READY,
        FC_ERROR_COUNT,
    } fc_state_t;

    typedef enum
    {
        RGB_STATE_MODE_FAST = 0,
        RGB_STATE_MODE_SLOW,
        RGB_STATE_MODE_BREATH,
        RGB_STATE_MODE_DOT,
        RGB_STATE_MODE_OFF,
        RGB_STATE_MODE_ON,
        RGB_STATE_MODE_CNT,
    }rgb_state_t;
    extern uint32_t fc_states;
    extern uint8_t blinkValues[RGB_STATE_MODE_CNT]; //0: fast, 1: slow, 2: breath, 3: dot, 4: off
    void fc_state_show(void);
    void motor_led_state_set(uint8_t index, rgb_state_t state);
    void show_battery_level_by_motor_led(void);
    void show_battery_led(void);
#ifdef __cplusplus
}
#endif

#endif // FC_STATE_H
